package com.been.common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 时间工具处理类
 * 
 * @author been 2011-09-19
 */
public class DateUtil {

	/** 标准年月日 无分隔符 */
	public static final String DATE_FORMAT_PATTERN_STAND_NO_SPLIT = "yyyyMMdd";

	/** 标准年月日 有分隔符 - */
	public static final String DATE_FORMAT_PATTERN_STAND_SPLIT_I = "yyyy-MM-dd";

	/** 标准年月日 有分隔符 / */
	public static final String DATE_FORMAT_PATTERN_STAND_SPLIT_II = "yyyy/MM/dd";

	/** 标准时间 年月日 时分秒 */
	public static final String DATE_FORMAT_PATTERN_DATE_TIME_STAND_I = "yyyy-MM-dd HH:mm:ss";

	/** 标准时间 年月日 时分 */
	public static final String DATE_FORMAT_PATTERN_DATE_TIME_STAND_II = "yyyy-MM-dd HH:mm";

	/** 时间 年月日 时分秒毫秒 */
	public static final String DATE_FORMAT_PATTERN_DATE_TIME_ALL = "yyyy-MM-dd HH:mm:ss.SSS";

	/** 中文星期名的数组 */
	public static final String[] WEEK_DAY_CN_NAME = { "星期日", "星期一", "星期二",
			"星期三", "星期四", "星期五", "星期六" };

	/**
	 * 得到标准时间为 yyyy-MM-dd 00:00:00
	 * 
	 * @return 日历对象
	 */
	public static Calendar getCalendar() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		return calendar;
	}

	/**
	 * 将时间格式化
	 * 
	 * @param date
	 *            需要格式化的时间
	 * @param pattern
	 *            格式化后的日期
	 * @return 格式化后的字符串
	 */
	public static String formatDate(Date date, String pattern) {
		if (null == date) {
			return null;
		}
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
			return dateFormat.format(date);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 将传进来的日期字符串转根据格式换为日期对象
	 * 
	 * @param dateString
	 *            需要转换的字符串
	 * @param pattern
	 *            日期格式
	 * @return 返回格式化的日期
	 */
	public static Date parseDate(String dateString, String pattern) {
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
			return dateFormat.parse(dateString);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 比较2个值之间的相差天数，防止前后日期颠倒，返回相差天数的绝对值
	 * 
	 * @param beginDate
	 *            开始日期
	 * @param endDate
	 *            结束日期
	 * @return 返回相差天数的绝对值
	 */
	public static long compareTwoDate(Date beginDate, Date endDate) {
		long midValue = endDate.getTime() - beginDate.getTime();
		return Math.abs(midValue) / (1000 * 60 * 60 * 24);
	}

	/**
	 * 返回日期的中文星期名
	 * 
	 * @param calendar
	 *            需要解析的日期
	 * @return 返回日期的中文星期名
	 */
	public static String getWeekDayName(Calendar calendar) {
		String weekDayName = "星期六";
		switch (calendar.get(Calendar.DAY_OF_WEEK)) {
		case 1:
			weekDayName = "星期日";
			break;
		case 2:
			weekDayName = "星期一";
			break;
		case 3:
			weekDayName = "星期二";
			break;
		case 4:
			weekDayName = "星期三";
			break;
		case 5:
			weekDayName = "星期四";
			break;
		case 6:
			weekDayName = "星期五";
			break;
		default:
			break;
		}
		return weekDayName;
	}

	/**
	 * 返回日期的中文星期名
	 * 
	 * @param calendar
	 *            需要解析的日期
	 * @return 返回日期的中文星期名
	 */
	public static String getWeekDayCNName(Calendar calendar) {
		return WEEK_DAY_CN_NAME[calendar.get(Calendar.DAY_OF_WEEK) - 1];
	}

	/**
	 * 得到当前时间的long值
	 * 
	 * @return 返回时间的值
	 */
	public static long getCurLongTime() {
		return System.currentTimeMillis();
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Calendar calendar = Calendar.getInstance();
		System.out.println(getWeekDayCNName(calendar));
		if (calendar instanceof GregorianCalendar) {
			System.out.println("Yes this is instanceof GregorianCalendar!");
		}
		/*
		 * System.out.println(formatDate(new Date(),
		 * DATE_FORMAT_PATTERN_STAND_NO_SPLIT));
		 * System.out.println(formatDate(new Date(),
		 * DATE_FORMAT_PATTERN_STAND_SPLIT)); System.out.println(formatDate(new
		 * Date(), DATE_FORMAT_PATTERN_DATE_TIME_STAND));
		 * System.out.println(formatDate(new Date(),
		 * DATE_FORMAT_PATTERN_DATE_TIME_ALL));
		 */
		calendar.set(Calendar.DATE, 25);
		System.out.println(getWeekDayName(calendar));
		calendar = getCalendar();
		Date endDate = calendar.getTime();
		calendar.set(Calendar.MONTH, 1);
		Date beginDate = calendar.getTime();
		System.out.println(compareTwoDate(beginDate, endDate));

		System.out.println(getCurLongTime());

		System.out.println(getWeekDayCNName(calendar));

	}

}
